package Formularios;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import org.eclipse.wb.swing.FocusTraversalOnArray;
import java.awt.Component;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

public class frmEntradaProductos extends JFrame {

	private JPanel contentPane;
	private JTextField txtCodigo;
	private JTextField txtNombre;
	private JLabel lblCantidad;
	private JTextField txtCantidad;
	private JTable table;
	private JTextField txtUnidadMed;
	private StatusBar sbMensaje;
	
	// NEMONICOS
	static final int COL_COD_REACTIVO = 0;
	static final int COL_DESCRIPCION = 1;
	static final int COL_CANTIDAD = 2;
	
	// teclas Virtuales
	static final int VK_SALTO_DE_LINEA = 10;
	static final int VK_F5 = 116;
	static final int VK_SUPR = 127;

	static Statement comando;
	static Connection con;
	static int iRenglon = 0;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					frmEntradaProductos frame = new frmEntradaProductos();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public frmEntradaProductos() {
		iRenglon = 0;
		setTitle("Producción de Productos");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 450, 351);
		
		// Centrar
		setLocationRelativeTo(null);
		
		general gen = new general();
		try {
			comando = gen.abrirConexion(cNemonicos.IP_GLOBAL,1);
		} catch (ClassNotFoundException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		} catch (SQLException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblCodigo = new JLabel("Codigo :");
		lblCodigo.setHorizontalAlignment(SwingConstants.RIGHT);
		lblCodigo.setBounds(12, 12, 85, 15);
		contentPane.add(lblCodigo);
		
		txtCodigo = new JTextField();
		txtCodigo.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
				if ( iRenglon > 0)
				{
					sbMensaje.setText("[ ENTER ] Continuar  [ F5 ] Guardar");
				}
				else
				{
					sbMensaje.setText("[ ENTER ] Continuar ");
				}
			}
		});
		txtCodigo.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				switch (arg0.getKeyCode()) {
				case VK_SALTO_DE_LINEA:
					if ( conslutarNombreProducto(Integer.parseInt(txtCodigo.getText())) )
					{
						txtCantidad.requestFocus();
					}
					else
					{
						txtCodigo.setSelectionStart(0);
						txtCodigo.setSelectionEnd(txtCodigo.getText().length());
					}
					break;
				case VK_F5:
					if ( guardar() )
					{
						limpiarSalida();
						limpiarGrid();
					}
					break;

				default:
					break;
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				char c = e.getKeyChar();
				if ((!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
					getToolkit().beep();
					e.consume();
				}
				if (txtCodigo.getText().length() == 3) {
					e.consume();
				}
			}
		});
		txtCodigo.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtCodigo.getText().length() > 0 && txtNombre.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de capturar un producto valido","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtCodigo.requestFocus();
					return false;
				}
				
			}
		});
		txtCodigo.setBounds(108, 8, 59, 19);
		contentPane.add(txtCodigo);
		txtCodigo.setColumns(10);
		
		txtNombre = new JTextField();
		txtNombre.setEditable(false);
		txtNombre.setBounds(179, 8, 209, 19);
		contentPane.add(txtNombre);
		txtNombre.setColumns(10);
		
		lblCantidad = new JLabel("Cantidad :");
		lblCantidad.setHorizontalAlignment(SwingConstants.RIGHT);
		lblCantidad.setBounds(12, 39, 85, 15);
		contentPane.add(lblCantidad);
		
		txtCantidad = new JTextField();
		txtCantidad.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					if ( txtCantidad.getText().length() > 0 )
					{						
						table.setValueAt(Integer.parseInt(txtCodigo.getText()), iRenglon, COL_COD_REACTIVO);
						table.setValueAt(txtNombre.getText(), iRenglon, COL_DESCRIPCION);
						table.setValueAt(Integer.parseInt(txtCantidad.getText()), iRenglon, COL_CANTIDAD);
						iRenglon++;
						limpiarSalida();
						txtCodigo.requestFocus();
					}
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				char c = e.getKeyChar();
				if ((!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
					getToolkit().beep();
					e.consume();
				}
				if (txtCantidad.getText().length() == 2) {
					e.consume();
				}
			}
		});
		txtCantidad.setBounds(108, 37, 39, 19);
		contentPane.add(txtCantidad);
		txtCantidad.setColumns(10);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 85, 424, 185);
		contentPane.add(scrollPane);
		
		table = new JTable();
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
				{null, null, null},
			},
			new String[] {
				"Codigo", "Descripcion", "Cantidad"
			}
		) {
			Class[] columnTypes = new Class[] {
				Integer.class, String.class, Integer.class
			};
			public Class getColumnClass(int columnIndex) {
				return columnTypes[columnIndex];
			}
			boolean[] columnEditables = new boolean[] {
				false, false, false
			};
			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		table.getColumnModel().getColumn(0).setResizable(false);
		table.getColumnModel().getColumn(1).setResizable(false);
		table.getColumnModel().getColumn(1).setPreferredWidth(200);
		table.getColumnModel().getColumn(2).setResizable(false);
		scrollPane.setViewportView(table);
		
		sbMensaje = new StatusBar();
		sbMensaje.setHorizontalAlignment(SwingConstants.CENTER);
		sbMensaje.setBounds(12, 302, 424, 16);
		contentPane.add(sbMensaje);
		
		txtUnidadMed = new JTextField();
		txtUnidadMed.setEditable(false);
		txtUnidadMed.setBounds(179, 37, 39, 19);
		contentPane.add(txtUnidadMed);
		txtUnidadMed.setColumns(10);
		setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{txtCodigo, txtCantidad}));
	}
	
	public boolean conslutarNombreProducto(int iCodigo) {

		boolean bResultado = true;
		try {

			// Una variable String para almacenar la sentencia SQL
			String query = "select trim(nombre) as nombre, unidadmedida from productos where codigo = "
					+ iCodigo + ";";

			ResultSet resultado = comando.executeQuery(query);

			// Ejecutamos la consulta SQL
			if (resultado.next()) {
				txtNombre.setText(resultado.getString("nombre"));
				txtUnidadMed.setText(resultado.getString("unidadmedida"));
			}
			else
			{
				bResultado = false;
			}

		} catch (SQLException e) {
			bResultado = false;
			// Por si ocurre un error
			System.out.println(e.getMessage());
			int op = JOptionPane.showOptionDialog(null, e.getMessage(),
					"Entrada Invalidad", JOptionPane.YES_OPTION,
					JOptionPane.ERROR_MESSAGE, null,
					new Object[] { "ACEPTAR" }, "ACEPTAR");
			if (op == 0) {

			}
		}

		return bResultado;
	}
	
	public boolean guardar() {
		boolean bResultado = true;
		String query = null;
		int iNumEntrada = 0;
		
		general.generarTransaccion(comando, "Begin");
		
		try {
			
			iNumEntrada = general.consultarFolio(comando,cNemonicos.FOLIO_ENTRADAS,cNemonicos.INCREMENTAR_SECUENCIA);

			for (int Ren = 0; Ren < iRenglon; Ren++) {
				int iCodigo = (int) table.getValueAt(Ren, COL_COD_REACTIVO);
				int iCantidad = (int) table.getValueAt(Ren, COL_CANTIDAD);
				
				// insertar detalle
				query = String.format("SELECT reguardarentrada('2','P'," + iNumEntrada + "," + iCodigo+ "," + iCantidad + ")");
				System.out.println(query);
				cTotal insertar = new cTotal(comando);
				insertar.ejecutar(query);

			}
			
			// insertar Encabezado
			query = String.format("SELECT reguardarentrada('1','P'," + iNumEntrada + ",0,0 )");
			System.out.println(query);
			cTotal insertar = new cTotal(comando);
			insertar.ejecutar(query);
			general.generarTransaccion(comando, "Commit");

		} catch (SQLException e) {
			general.generarTransaccion(comando, "Rollback");
			general.grabarError("frmEntradaProductos", "guardar", -1, query, e.getMessage(),"Error al insertar Producto");
			// TODO Auto-generated catch block
			bResultado = false;
			e.printStackTrace();
		}

		return bResultado;
	}
	
	public void limpiarSalida()
	{
		txtCodigo.setText("");
		txtNombre.setText("");
		txtUnidadMed.setText("");
		txtCantidad.setText("");
	}
	public void limpiarGrid()
	{		
		for (int iRen = 0; iRen < table.getRowCount(); iRen++) {
			table.setValueAt(null,iRen, COL_COD_REACTIVO);
			table.setValueAt(null,iRen, COL_DESCRIPCION);
			table.setValueAt(null,iRen, COL_CANTIDAD);
		}
		iRenglon = 0;
	}

}
